package com.fxb.learn;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author fangjiaxiaobai
 * @description:
 * @date 2021-11-09 09:54
 */
public class StreamEnhanceDemo {

    public static void main(String[] args) {
//        demo1();

//        demo2();
//
//        demo3();

        demo4();
    }

    /**
     * 新增单个元素的Stream构造,允许为空
     */
    public static void demo1() {
        System.out.println(Stream.ofNullable(null).count()); // 0
        System.out.println(Stream.of(1).count()); //1
    }

    /**
     * 演示take while方法
     * <p>
     * 从头开始计算，遇到不满足Predicate的元素即停止。
     */
    public static void demo2() {
        List<Integer> collect1 = Stream.of(1, 2, 3, 4, 5, 3, 2, 1).takeWhile(i -> i <= 3).collect(Collectors.toList());
        System.out.println(collect1); // [1, 2, 3]

        List<Integer> collect2 = Stream.of(1, 2, 3, 4, 5, 4, 3, 2, 1).takeWhile(i -> i > 6).collect(Collectors.toList());
        System.out.println(collect2); // [ ]
    }

    /**
     * 演示 dropWhile 方法
     * 从头开始计算，遇到第一个不满足 Predicte的元素时，开始计算。
     */
    public static void demo3() {
        List<Integer> collect1 = Stream.of(1, 2, 3, 4, 5, 4, 3, 2, 1).dropWhile(i -> i <= 3).collect(Collectors.toList());
        System.out.println(collect1); // [1, 2, 3, 4, 5, 4, 3, 2, 1]

        List<Integer> collect2 = Stream.of(1, 2, 3, 4, 5, 4, 3, 2, 1).dropWhile(i -> i > 3).collect(Collectors.toList());
        System.out.println(collect2); // [4, 5, 4, 3, 2, 1]
    }

    /**
     * 演示 iterate 的重载方法
     */
    public static void demo4() {
        // Jdk8支持使用这种方式， 生成从1开始的平方数
        List<Integer> collect1 = Stream.iterate(1, i -> i * 2).limit(5).collect(Collectors.toList());
        System.out.println(collect1); // [1, 2, 4, 8, 16]

        // JDK9 支持，加入一个 Prediction, 判断如何终止。
        List<Integer> collect2 = Stream.iterate(1, i -> i <= 16, i -> i * 2).limit(10).collect(Collectors.toList());
        System.out.println(collect2); // [1, 2, 4, 8, 16]
    }
}
